package com.wg.springboot.jdk.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * @Description:反射
 * @Author WuGang
 * @Date 2021/10/28 11:45
 * @Version 1.0
 */
public class Reflection {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//        反射的三种方式1
        Class<String> stringClass = String.class;
//        反射的三种方式2
        String s = new String();
        Class<? extends String> aClass = s.getClass();
//        反射的三种方式3
        Class<?> aClass1 = Class.forName("java.lang.String");
//       调用类的无参构造创建对象
        String s1 = aClass.newInstance();
//        获取方法
        Method[] methods = aClass.getDeclaredMethods();
        for (Method m:methods){
            System.out.println("方法名"+m.getName());
            System.out.println("返回值类型的名字"+m.getReturnType().getName());
            System.out.println();
//            获取参数数组
            Class<?>[] parameterTypes = m.getParameterTypes();
            for (Class p:parameterTypes){
                System.out.println("参数类型的名字"+p.getName());
            }
        }
//        获取字段属性
        Field[] fields = aClass.getDeclaredFields();
        for (Field f:fields){
            System.out.println("属性的名字"+f.getName()+"属性的返回值名字"+f.getType().getName());
        }
//        获取类的接口
        Class<?>[] interfaces = aClass.getInterfaces();
        for (Class  c:interfaces){
            System.out.println("接口名字"+c.getName());
        }
//        获取父类
        Class<?> superclass = aClass.getSuperclass();
//        获取String的权限定类名
        System.out.println(String.class.getName());
    }
}
